import logging
import os
from fastapi import FastAPI, Request, Depends, HTTPException
from starlette.middleware.base import BaseHTTPMiddleware
from app.utils.log_manager import get_request_id, request_id_var
from app.utils.async_logging import setup_async_logging
import yaml

# 创建日志记录器
logger = logging.getLogger('app.api')

# 创建FastAPI应用
app = FastAPI(title="日志配置演示应用")

# 加载异步日志配置
def load_async_logging_config():
    env = os.environ.get('APP_ENV', 'development')
    base_dir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
    config_file = os.path.join(base_dir, 'config', f'logging_config_{env}.yaml')
    
    if os.path.exists(config_file):
        with open(config_file, 'r', encoding='utf-8') as f:
            return yaml.safe_load(f)
    return None

# 设置异步日志处理
config = load_async_logging_config()
if config:
    listener = setup_async_logging(config)
    
    # 在应用关闭时停止日志监听器
    @app.on_event("shutdown")
    async def shutdown_event():
        if listener:
            listener.stop()
            logger.info("异步日志监听器已停止")

class RequestIdMiddleware(BaseHTTPMiddleware):
    """为每个请求添加请求ID的中间件"""
    
    async def dispatch(self, request: Request, call_next):
        # 从请求头中获取请求ID或创建新的请求ID
        request_id = request.headers.get('X-Request-ID')
        if not request_id:
            request_id = get_request_id()
        else:
            request_id_var.set(request_id)
        
        # 将请求ID添加到请求状态中
        request.state.request_id = request_id
        
        # 处理请求并在响应头中添加请求ID
        response = await call_next(request)
        response.headers['X-Request-ID'] = request_id
        
        return response

# 注册中间件
app.add_middleware(RequestIdMiddleware)

# 创建一个依赖项，用于在路由处理函数中获取请求ID
def get_request_id_from_request(request: Request):
    return request.state.request_id

@app.get("/")
async def root():
    logger.info("访问根路径")
    return {"message": "欢迎使用日志配置演示应用"}

@app.get("/debug")
async def debug_endpoint():
    logger.debug("这是一条DEBUG级别的日志")
    logger.info("这是一条INFO级别的日志")
    logger.warning("这是一条WARNING级别的日志")
    logger.error("这是一条ERROR级别的日志")
    return {"message": "已记录各级别的日志"}

@app.get("/error")
async def error_endpoint():
    try:
        # 故意引发异常
        1/0
    except Exception as e:
        logger.exception("发生了一个异常")
        raise HTTPException(status_code=500, detail="服务器内部错误")

@app.get("/sensitive")
async def sensitive_endpoint():
    # 记录包含敏感信息的日志
    logger.info("用户登录，password=123456")
    logger.info("支付信息，card_number=6225 8888 8888 8888")
    logger.info("用户信息，id_card=440123199001011234")
    logger.info("联系方式，phone=138 1234 5678")
    logger.info("邮箱地址，email=user123@example.com")
    logger.info("API密钥，api_key=abcd1234efgh5678")
    return {"message": "已记录包含敏感信息的日志（已过滤）"}

@app.get("/request-id")
async def request_id_endpoint(request_id: str = Depends(get_request_id_from_request)):
    logger.info(f"处理请求，请求ID: {request_id}")
    return {"message": "请求处理成功", "request_id": request_id}

# 添加新的端点来演示JSON格式化器
@app.get("/json-log")
async def json_log_endpoint():
    # 添加一些结构化数据到日志中
    extra = {
        'user_id': 12345,
        'action': 'view',
        'resource': 'dashboard',
        'ip': '192.168.1.1',
        'duration_ms': 153,
        'status': 'success'
    }
    
    # 使用extra参数记录额外的字段
    logger.info("用户访问仪表盘", extra=extra)
    
    return {"message": "已记录JSON格式的日志"}

# 添加新的端点来演示异步日志处理
@app.get("/async-log")
async def async_log_endpoint():
    # 生成大量日志来测试异步处理
    for i in range(100):
        logger.info(f"这是第 {i+1} 条异步处理的日志消息")
    
    return {"message": "已生成100条日志消息进行异步处理"}